home *** CD-ROM | disk | FTP | other *** search
/ The Electronic Whole Earth Catalog / ElectronicWholeEarthCatalog.img / QUICK SEARCH / stack.txt < prev   
Text File  |  1989-02-14  |  22KB  |  770 lines

  1. -- stack: in
  2. -- format: 8 (HyperCard 1)
  3. -- flags: 0x1000 (none)
  4. -- protect password hash: 0
  5. -- maximum user level: 5 (scripting)
  6. -- window: Rect(x1=0, y1=0, x2=0, y2=0)
  7. -- screen: Rect(x1=0, y1=0, x2=0, y2=0)
  8. -- card dimensions: w=0 h=0
  9. -- scroll: x=0 y=0
  10. -- background count: 2
  11. -- first background id: 2779
  12. -- card count: 2
  13. -- first card id: 3592
  14. -- list block id: 4769
  15. -- print block id: 3487
  16. -- font table block id: 0
  17. -- style table block id: 0
  18. -- free block count: 4
  19. -- free size: 23808 bytes
  20. -- total size: 65536 bytes
  21. -- stack block size: 25088 bytes
  22. -- created by hypercard version: 0x01208000
  23. -- compacted by hypercard version: 0x01228000
  24. -- modified by hypercard version: 0x01228000
  25. -- opened by hypercard version: 0x01228000
  26. -- patterns[0]: 0x0000000000000000
  27. -- patterns[1]: 0x0000220000002200
  28. -- patterns[2]: 0x8800220088002200
  29. -- patterns[3]: 0xCC003300CC003300
  30. -- patterns[4]: 0xCC883322CC883322
  31. -- patterns[5]: 0xEE88BB22EE88BB22
  32. -- patterns[6]: 0xEECCBB33EECCBB33
  33. -- patterns[7]: 0xFFCCFF33FFCCFF33
  34. -- patterns[8]: 0xFFEEFFBBFFEEFFBB
  35. -- patterns[9]: 0xFFFFFFBBFFFFFFBB
  36. -- patterns[10]: 0x8010022001084004
  37. -- patterns[11]: 0xFFFFFFFFFFFFFFFF
  38. -- patterns[12]: 0x8822882288228822
  39. -- patterns[13]: 0x1122448811224488
  40. -- patterns[14]: 0xC4800C6843023026
  41. -- patterns[15]: 0xB130031BD8C00C8D
  42. -- patterns[16]: 0xAA00AA00AA00AA00
  43. -- patterns[17]: 0x8822552288225522
  44. -- patterns[18]: 0x8855225588552255
  45. -- patterns[19]: 0x77DD77DD77DD77DD
  46. -- patterns[20]: 0x8000000000000000
  47. -- patterns[21]: 0xAA55AA55AA55AA55
  48. -- patterns[22]: 0x038448300C020101
  49. -- patterns[23]: 0x8244394482010101
  50. -- patterns[24]: 0x8814224188412214
  51. -- patterns[25]: 0x8080413E080814E3
  52. -- patterns[26]: 0x22048C7422179810
  53. -- patterns[27]: 0xBE808808EB088880
  54. -- patterns[28]: 0x25C8328964244C92
  55. -- patterns[29]: 0xA29C41BE2AC914EB
  56. -- patterns[30]: 0x40A00000040A0000
  57. -- patterns[31]: 0x8040200002040800
  58. -- patterns[32]: 0xAA00800088008000
  59. -- patterns[33]: 0xFF80808080808080
  60. -- patterns[34]: 0x081C22C180010204
  61. -- patterns[35]: 0xFF808080FF080808
  62. -- patterns[36]: 0xF87422478F172271
  63. -- patterns[37]: 0xBF00BFBFB0B0B0B0
  64. -- patterns[38]: 0xFF7FBE5DA2418000
  65. -- patterns[39]: 0xFAF5FAF5A050A050
  66. -- checksum: 0x0
  67. ----- HyperTalk script -----
  68. -- 2/1 jdt
  69. on openStack
  70.   initStackList
  71.   openSearch
  72. end openStack
  73.  
  74. on closeStack
  75.   closeSearchFiles
  76. end closeStack
  77.  
  78. on doMenu menuChoice
  79.   if menuChoice = "Help" then
  80.     goHelp
  81.   else
  82.     pass doMenu
  83.   end if
  84. end doMenu
  85.  
  86. on idle
  87.   global keyNum, keyFindings, searchWord
  88.  
  89.   -- ugly kludge because if you launch from a locked stack, Hypercard
  90.   -- throws away all changes made during openStack
  91.   if the userModify is false then
  92.     set userModify to true
  93.     if number of this card is "1" then
  94.       put keyFindings into fld "findings"
  95.       put searchWord into cd fld "searchFor"
  96.     end if
  97.   end if
  98.   pass idle
  99. end idle
  100.  
  101. on goHelp
  102.   if number of this card  = 1 then
  103.     put showHelp("Quick Search 1") into helpChoice
  104.   else if number of this card = 2 then
  105.     put showHelp("Quick Search 2") into helpChoice
  106.   end if
  107.  
  108.   if helpChoice = 1 then
  109.     go to card id 33789 of stack "Introduction"
  110.   else if helpChoice = 2 then
  111.     go to stack "Help"
  112.   else
  113.     -- if helpChoice = 3 then stay here
  114.   end if
  115. end goHelp
  116.  
  117. function getPath
  118. -- construct the file path of WE stacks and save in global 'thePath'
  119. put long name of this stack into thePath
  120. delete first word of thePath
  121.  
  122. repeat while last char of thePath <> ":"
  123.   delete last char of thePath
  124. end repeat
  125.  
  126. delete first char of thePath     -- delete leading Quote
  127. return thePath
  128. end getPath
  129.  
  130. on zeroFiles
  131.   global textFileNum, keyFileNum, ptrFileNum, keyNum
  132.  
  133.   put 0 into textFileNum
  134.   put 0 into keyFileNum
  135.   put 0 into ptrFileNum
  136. end zeroFiles
  137.  
  138. on initStackList
  139.   global stackList
  140.  
  141.   -- note: there is no stack 13; MUSIC is #14
  142.   put "COMMUNITY,COMMUNICATIONS,CRAFT,HEALTH" into stackList
  143.   put ",HOUSEHOLD,LEARNING,LIVELIHOOD,MEDIA,NOMADICS" after stackList
  144.   put ",PLACE,WHOLE SYSTEMS,INTRODUCTION,,MUSIC" after stackList
  145. end initStackList
  146.  
  147. on closeSearchFiles
  148.   global textFileNum, keyFileNum, ptrFileNum
  149.  
  150.   if textFileNum <> 0 then
  151.     get closeFile(textFileNum)
  152.     put 0 into textFileNum
  153.   end if
  154.   if keyFileNum <> 0 then
  155.     get closeFile(keyFileNum)
  156.     put 0 into keyFileNum
  157.   end if
  158.   if ptrFileNum <> 0 then
  159.     get closeFile(ptrFileNum)
  160.     put 0 into ptrFileNum
  161.   end if
  162. end closeSearchFiles
  163.  
  164. function getTargetOffset target, size
  165. put (target - size/2) into fileOffset
  166. if fileOffset < 0 then put 0 into fileOffset
  167. return (target - fileOffset)
  168. end getTargetOffset
  169.  
  170. on fillKeysField delta
  171.   -- fill the index display centered around keyNum with delta entries
  172.   -- above and below it
  173.   global keyNum, keyFileNum, maxKey, keyFindings
  174.  
  175.   if keyFileNum is 0 then
  176.     beep
  177.     exit fillKeysField
  178.   end if
  179.  
  180.   put abs(delta) into delta  -- Texas code used neg offset here
  181.  
  182.   -- topFill and bottomFill are the number of CR's that will need to be
  183.   -- added to the keysfield in order to center the target in case the
  184.   -- target is too close to the start or end of the index file
  185.   if keyNum >= delta then
  186.     put keyNum - delta into firstKey
  187.     put 0 into topFill
  188.   else
  189.     put 0 into firstKey
  190.     put delta - keyNum into topFill
  191.   end if
  192.  
  193.   if keyNum + delta + 1 <= maxKey then
  194.     put keyNum + delta + 1 into lastKey
  195.     put 0 into bottomFill
  196.   else
  197.     put maxKey into lastKey
  198.     put keyNum + delta + 1 - maxKey into bottomFill
  199.   end if
  200.  
  201.   put getKeys(lastKey - firstKey, firstKey, keyFileNum) into keyFindings
  202.  
  203.   if topFill <> 0 then
  204.     repeat with i = 1 to topFill
  205.       put Return before keyFindings
  206.     end repeat
  207.   end if
  208.  
  209.   if bottomFill <> 0 then
  210.     repeat with i = 1 to bottomFill
  211.       put Return after keyFindings
  212.     end repeat
  213.   end if
  214.  
  215.   put keyFindings into field "findings" of card "Main"
  216. end fillKeysField
  217.  
  218. ---------------------- Scroll Bar Routines -------------------------
  219. -- Scroll bar routines are in stack script so they can be used
  220. -- by scroll bars on different cards.
  221. --
  222. -- To use these routines:
  223. -- 1) Paint a gray scroll bar onto the card.
  224. -- 2) Paste the "Pager" and "Thumb" buttons into position.
  225. -- 3) Setup a hidden card field, "scrollInfo", and fill it with data
  226. --     Item 1: low coordinate of thumb (its location)
  227. --     Item 2: hi coordinate of thumb
  228. --     Item 3: present setting of thumb (1 - range)
  229. --     Item 4: range (number of positions, "stops", of thumb on scroll)
  230. --     Item 5: H or V (horizontal or vertical)
  231. --     Item 6: page size (number of stops to jump when paged)
  232. --
  233. -- All interaction with the scroll bar will be via the scrollInfo
  234. -- values.  Install scroll bar routines into appropriate mouse
  235. -- message scripts to the "Pager" and "Thumb" buttons, along with the
  236. -- routines that respond to changes in the scroll bar.
  237. --------------------------------------------------------------------
  238.  
  239. function calcSettingPos minCoord, maxCoord, setting, range
  240. -- returns the coordinate position of the thumb for a given setting
  241. put maxCoord - minCoord into thumbDistance
  242. put (setting - 1) * thumbDistance / (range - 1) into thumbPos
  243. put round(thumbPos) into thumbPos
  244. add minCoord to thumbPos
  245. return thumbPos
  246. end calcSettingPos
  247.  
  248. on updateThumb
  249.   -- uses values in "scrollInfo" to redraw thumb at appropriate position
  250.   put cd field "scrollInfo" into scrollInfo
  251.   put item 1 of scrollinfo into minCoord
  252.   put item 2 of scrollinfo into maxCoord
  253.   put item 3 of scrollinfo into setting
  254.   put item 4 of scrollinfo into range
  255.   put item 5 of scrollinfo into orientation
  256.  
  257.   put calcSettingPos(minCoord,maxCoord,setting,range) into thumbPos
  258.  
  259.   get loc of card button "Thumb"
  260.   if item 5 of scrollInfo contains "H" then
  261.     put thumbPos into item 1 of It
  262.   else
  263.     put thumbPos into item 2 of It
  264.   end if
  265.   set loc of button "Thumb" to It
  266. end updateThumb
  267.  
  268. function calcNearestSetting position, loCoord, hiCoord, range
  269. -- returns nearest setting stop for a given coordinate position
  270. put (position - loCoord) * (range - 1)/(hiCoord - loCoord) into temp
  271. return round(temp) + 1
  272. end calcNearestSetting
  273.  
  274. on updateSetting
  275.   -- updates setting value in "scrollInfo" according to current
  276.   -- thumb position (in coords)
  277.   put cd field "scrollInfo" into scrollInfo
  278.   put loc of cd button "Thumb" into thumbLoc
  279.   if item 5 of scrollInfo contains "H" then
  280.     put item 1 of thumbLoc into thumbPos
  281.   else
  282.     put item 2 of thumbLoc into thumbPos
  283.   end if
  284.  
  285.   put item 1 of scrollInfo into loCoord
  286.   put item 2 of scrollInfo into hiCoord
  287.   put item 4 of scrollInfo into range
  288.   put calcNearestSetting(thumbPos, loCoord, hiCoord, range) into item 3 of cd field "scrollInfo"
  289. end updateSetting
  290.  
  291. on pageThumb
  292.   -- jump the thumb up or down a stop
  293.   put cd field "scrollInfo" into scrollInfo
  294.   if item 5 of scrollInfo contains "H" then
  295.     put item 1 of the loc of card button "Thumb" into thumbPos
  296.     put the mouseH into mousePos
  297.   else
  298.     put item 2 of the loc of card button "Thumb" into thumbPos
  299.     put the mouseV into mousePos
  300.   end if
  301.  
  302.   put item 3 of scrollInfo into setting
  303.   put item 4 of scrollInfo into range
  304.   put item 6 of scrollinfo into pageSize
  305.  
  306.   if mousePos > thumbPos then
  307.     add pageSize to setting
  308.   else
  309.     subtract pageSize from setting
  310.   end if
  311.  
  312.   if setting > range then put range into setting
  313.   else
  314.     if setting < 1 then put 1 into setting
  315.   end if
  316.  
  317.   put setting into item 3 of cd field "scrollInfo"
  318.   updateThumb
  319. end pageThumb
  320.  
  321. on dragThumb
  322.   -- we want the thumb to follow the users mouse movement while dragging
  323.   -- so we must catch it on the mouseDown
  324.   put cd field "scrollInfo" into scrollInfo
  325.   put item 1 of scrollInfo into minThumb
  326.   put item 2 of scrollInfo into maxThumb
  327.  
  328.   if item 5 of scrollInfo contains "H" then
  329.     dragHorizontal minThumb, maxThumb
  330.   else
  331.     dragVertical minThumb, maxThumb
  332.   end if
  333. end dragThumb
  334.  
  335. on finishDragThumb
  336.   -- updates "scrollInfo" to setting closest to current thumb position
  337.   -- then redraws thumb to that setting stop
  338.   updateSetting
  339.   updateThumb
  340. end finishDragThumb
  341.  
  342. on dragHorizontal minCoord, maxCoord
  343.   -- fakes dragging the thumb horizontally
  344.   repeat while the mouse is down
  345.     put item 1 of the loc of button Thumb into thumbH
  346.     put the mouseH - thumbH into thumbDelta
  347.     if thumbDelta <> 0 then
  348.       put loc of button Thumb into newThumbLoc
  349.       add thumbDelta to item 1 of newThumbLoc
  350.       if item 1 of newThumbLoc < minCoord then
  351.         put minCoord into item 1 of newThumbLoc
  352.       else
  353.         if item 1 of newThumbLoc > maxCoord then
  354.           put maxCoord into item 1 of newThumbLoc
  355.         end if
  356.       end if
  357.       set loc of button Thumb to newThumbLoc
  358.     end if
  359.   end repeat
  360. end dragHorizontal
  361.  
  362. on dragVertical minCoord, maxCoord
  363.   -- fakes dragging the thumb horizontally
  364.   repeat while the mouse is down
  365.     put item 2 of the loc of button "Thumb" into thumbV
  366.     put the mouseV - thumbV into thumbDelta
  367.     if thumbDelta <> 0 then
  368.       put loc of button Thumb into newThumbLoc
  369.       add thumbDelta to item 2 of newThumbLoc
  370.       if item 2 of newThumbLoc < minCoord then
  371.         put minCoord into item 2 of newThumbLoc
  372.       else
  373.         if item 2 of newThumbLoc > maxCoord then
  374.           put maxCoord into item 2 of newThumbLoc
  375.         end if
  376.       end if
  377.       set loc of button Thumb to newThumbLoc
  378.     end if
  379.   end repeat
  380. end dragVertical
  381. ------------------ end scroll bar routines -------------------------
  382.  
  383. on doSearchFor
  384.   -- search based on contents of field "searchFor"
  385.   global maxKey, keyFileNum
  386.  
  387.   put stripLeadingSpace(cd fld "searchFor") into cd fld "searchFor"
  388.   put card field "searchFor" into tempSearchWord
  389.  
  390.   if tempSearchWord is empty then
  391.     answer "Type something to search for..."  with "OK"
  392.   else
  393.     set cursor to busy
  394.     put jumpKeyNoBeep (tempSearchWord, maxKey, keyFileNum) into tempKeyNum
  395.     if tempKeyNum is empty then
  396.       -- answer "Sorry, not found.  Check search files..." with "OK"
  397.     else
  398.       if tempKeyNum >= maxKey then
  399.         put (maxKey - 1) into tempKeyNum
  400.       end if
  401.       set cursor to busy
  402.       getKeyEntry tempKeyNum
  403.       send updateIndexScrollBar to card "Main"
  404.     end if
  405.   end if
  406.   select text of cd fld "searchFor"
  407.   set cursor to hand
  408. end doSearchFor
  409.  
  410. on doSearchForBeep
  411.   global maxKey, keyFileNum
  412.  
  413.   put stripLeadingSpace(cd fld "searchFor") into cd fld "searchFor"
  414.   put card field "searchFor" into tempSearchWord
  415.  
  416.   if tempSearchWord is empty then
  417.     answer "Type something to search for..." with "OK"
  418.   else
  419.     set cursor to busy
  420.     put jumpKey (tempSearchWord, maxKey, keyFileNum) into tempKeyNum
  421.     if tempKeyNum is empty then
  422.       answer "Sorry, not found.  Check search files..." with "OK"
  423.     else
  424.       if tempKeyNum >= maxKey then
  425.         put (maxKey - 1) into tempKeyNum
  426.       end if
  427.       set cursor to busy
  428.       getKeyEntry tempKeyNum
  429.       send updateIndexScrollBar to card "Main"
  430.     end if
  431.   end if
  432.   select text of cd fld "searchFor"
  433.   set cursor to hand
  434. end doSearchForBeep
  435.  
  436. on getKeyEntry tempKeyNum
  437.   -- Gets/sets the key globals 'keyNum', 'keyRecord' and 'searchWord',
  438.   -- and fills the "Findings" field.  Called by doSearchWord and the
  439.   -- mouse scripts for the index scrollbar buttons.
  440.   global keyNum, keyFileNum, keyRecord, searchWord
  441.  
  442.   put tempKeyNum into keyNum
  443.   fillKeysField -7
  444.   put getKeyRecord( keyNum, keyFileNum ) into keyRecord
  445.  
  446.   -- in a subject search, searchWord can contain commas,
  447.   -- spaces, and trailing whitespace; thus the following gyrations
  448.   put keyRecord into searchWord
  449.   delete item 1 to 2 of searchWord
  450.   put stripTrailingSpace(searchWord) into searchWord
  451. end getKeyEntry
  452.  
  453. function stripTrailingSpace thisText
  454. if thisText is not empty then
  455.   repeat while last char of thisText <= space
  456.     delete last char of thisText
  457.   end repeat
  458. end if
  459. return thisText
  460. end stripTrailingSpace
  461.  
  462. function stripLeadingSpace thisText
  463. if thisText is not empty then
  464.   repeat while first char of  thisText <= space
  465.     delete first char of thisText
  466.   end repeat
  467. end if
  468. return thisText
  469. end stripLeadingSpace
  470.  
  471. on stripSpaceFromSearchFor
  472.   if card field "searchFor" is not empty then
  473.     put card field "searchFor" into temp
  474.     put stripLeadingSpace(temp) into temp
  475.     put stripTrailingSpace(temp) into temp
  476.     put temp into card field "searchFor"
  477.   end if
  478. end stripSpaceFromSearchFor
  479.  
  480. function IsSearchString
  481. put card field "searchFor" into searchForStr
  482. put line 8 of cd field "Findings" into findingsStr
  483. end IsSearchString
  484.  
  485. on goOccurrence theOccurrence
  486.   -- Gets the text for a search occurrence and displays it on card 2.
  487.   -- 'keyRecord' and 'occurrence' must be set.
  488.   global occurrence, searchByState
  489.  
  490.   put theOccurrence into occurrence
  491.   getCardTextAndOffset
  492.   if searchByState = "Full Text" then
  493.     displayTextOccurrence
  494.   else if searchByState = "Subject" then
  495.     displaySubjectOccurrence
  496.   else if searchByState = "Author" then
  497.     displayAuthorOccurrence
  498.   else if searchByState = "Title" then
  499.     displayTitleOccurrence
  500.   else
  501.     displayTextOccurrence
  502.   end if
  503. end goOccurrence
  504.  
  505. on getCardTextAndOffset
  506.   global ptrFileNum, textFileNum, keyRecord, occurrence
  507.   global foundCardText, findOffset  -- only used by goOccurrence(s)
  508.  
  509.   put item 1 of keyRecord + occurrence - 1 into ptrNum
  510.   put getPtrRecord( ptrNum, ptrFileNum ) into textOffset
  511.  
  512.   put 5000 into MAXGRAB
  513.   put grabText( textOffset, MAXGRAB, textFileNum ) into grabbed
  514.   put getTargetOffset(textOffset, MAXGRAB) into grabbedOffset
  515.  
  516.   put findPrev("##A", grabbedOffset, grabbed) into cardStart
  517.   put findNext("##A", grabbedOffset, grabbed) into cardEnd
  518.   if (cardStart = -1) then put 0 into cardStart
  519.   if (cardEnd = -1) then put (MAXGRAB-1) into cardEnd
  520.   put char cardStart+1 to cardEnd of grabbed into foundCardText
  521.   put ( grabbedOffset - cardStart - 1) into findOffset
  522.  
  523.   setFoundInfo
  524. end getCardTextAndOffset
  525.  
  526. on setFoundInfo
  527.   global foundCardText, foundTitle, foundStack
  528.   global foundCardID, foundCardNum, findOffset, searchWord
  529.  
  530.   put line 1 of foundCardText into accessLine
  531.   put line 2 of foundCardText into titleLine
  532.   subtract the length of accessLine from findOffset
  533.   subtract the length of titleLine from findOffset
  534.  
  535.   delete word 1 of titleLine
  536.   put titleLine into foundTitle
  537.   put word 2 of accessLine into weStackID
  538.   put getWEStack(weStackID) into foundStack
  539.  
  540.   put word 3 of accessLine into foundCardID
  541.   put word 4 of accessLine into foundCardNum
  542.   delete line 1 to 2 of foundCardText
  543. end setFoundInfo
  544.  
  545. on deleteDblAtText
  546.   global foundCardText
  547.  
  548.   -- delete starting and ending '@@ + CR'
  549.   put offset("@@", foundCardText) into lenKeyWordArea
  550.   delete char 1 to (lenKeyWordArea + 2) of foundCardText
  551.   delete last line of foundCardText
  552.   delete last line of foundCardText
  553. end deleteDblAtText
  554.  
  555. on findKeyInText
  556.   global searchWord, findOffset
  557.  
  558.   lock screen
  559.   find chars searchWord in field "theText"
  560.   repeat until word 2 of the foundChunk >= findoffset
  561.     find chars searchWord in field "theText"
  562.   end repeat
  563.   unlock screen
  564. end findKeyInText
  565.  
  566. on selectKeyInText keyOffset
  567.   -- not used; alternate method of hiliting search target on card 2
  568.   -- by inverting the text instead of using the HyperCard 'find'
  569.   -- to put a rectangle around it
  570.   global searchWord
  571.  
  572.   if keyOffset < 0 then
  573.     exit selectKeyInText
  574.   end if
  575.  
  576.   put the length of searchWord into keyLength
  577.   subtract 1 from keyLength
  578.   if (char 1 of card field "key" <> char keyOffset of field "theText") then subtract 1 from keyOffset
  579.   select char keyOffset to (keyOffset + keyLength) of field "theText"
  580. end selectKeyInText
  581.  
  582. on displayTextOccurrence
  583.   go to card "Occurrence"
  584.   send "displayOccurrence" to card "Occurrence"
  585.   findKeyInText
  586. end displayTextOccurrence
  587.  
  588. on displaySubjectOccurrence
  589.   deleteDblAtText
  590.   go to card "Occurrence"
  591.   send "displayOccurrence" to card "Occurrence"
  592. end displaySubjectOccurrence
  593.  
  594. on displayTitleOccurrence
  595.   global searchWord
  596.  
  597.   deleteDblAtText
  598.   go to card "Occurrence"
  599.   send "displayOccurrence" to card "Occurrence"
  600.   find chars searchWord in field "foundTitle"
  601. end displayTitleOccurrence
  602.  
  603. on displayAuthorOccurrence
  604.   global searchWord
  605.  
  606.   deleteDblAtText
  607.   go to card "Occurrence"
  608.   send "displayOccurrence" to card "Occurrence"
  609.   find chars searchWord in field "theText"
  610. end displayAuthorOccurrence
  611.  
  612. function getWEStack stackNum
  613. global stackList
  614.  
  615. return item stackNum of stackList
  616. end getWEStack
  617.  
  618. function getSearchInName
  619. global searchInState
  620.  
  621. put searchInState into searchInName
  622. put underscoreSpaces(searchInName) into searchInName
  623.  
  624. return searchInName
  625. end getSearchInName
  626.  
  627. on getRandomEntry
  628.   global occurrence, searchWord, maxKey, searchInState
  629.  
  630.   getkeyEntry ( random(maxKey div 2) + (maxKey div 4) )
  631.   put searchWord into cd field "searchFor"
  632.   send updateIndexScrollBar to card "Main"
  633.   put 1 into occurrence
  634. end getRandomEntry
  635.  
  636. function underscoreSpaces theName
  637. put length of theName into charCount
  638. repeat with i = 1 to charCount
  639.   if char i of theName is Space then
  640.     put "_" into char i of theName
  641.   end if
  642. end repeat
  643. return theName
  644. end underscoreSpaces
  645. repeat while Space is in theName
  646.   put offset(Space, theName) into spacePos
  647.   put "_" into char spacePos of theName
  648. end repeat
  649.  
  650. function getSearchFiles baseName
  651. global qsPath, searchFile
  652.  
  653. -- piece together the search filename
  654. put getPath() & "searchFiles:" & baseName into searchFile
  655.  
  656. -- put "getSearchFiles" && searchfile into msg
  657.  
  658. return openIndexFilesjt3(searchFile)
  659. end getSearchFiles
  660.  
  661. function getSearchByExtension
  662. global searchByState
  663.  
  664. if searchByState = "Subject" then return ".S"
  665. else if searchByState = "Title" then return ".T"
  666. else if searchByState = "Author" then return ".A"
  667. else if searchByState = "Full Text" then return ".F"
  668. else return empty
  669. end getSearchByExtension
  670.  
  671. on openSearchFiles
  672.   global textFileNum, maxText, keyFileNum, maxKey
  673.   global ptrFileNum, maxPtr, keyNum
  674.  
  675.   put getSearchInName() & getSearchByExtension() & ".txt" into baseName
  676.   if baseName is "INTRODUCTION.A.txt" then
  677.     Answer "No search by Author in the Introduction"  with "OK"
  678.     put empty into fld "Findings"
  679.   else if baseName is "INTRODUCTION.S.txt" then
  680.     Answer "No search by Subject in the Introduction"  with "OK"
  681.     put empty into fld "Findings"
  682.   else
  683.     get getSearchFiles(baseName)
  684.     if It <> empty then
  685.       put first item of It into textFileNum
  686.       put second item of It into maxText
  687.       put third item of It into keyFileNum
  688.       put (fourth item of It) / 32 into maxKey
  689.       put fifth item of It into ptrFileNum
  690.       put (sixth item of It) / 4 into maxPtr
  691.       -- put trunc ( maxKey / 2) into keyNum
  692.     else
  693.       Answer "Problem opening index files..." with "OK"
  694.       put empty into fld "Findings" of card 1
  695.     end if
  696.   end if
  697. end openSearchFiles
  698.  
  699. on reopenSearchFiles
  700.   closeSearchFiles
  701.   openSearchFiles
  702.   if cd fld "searchFor" is empty then
  703.     getRandomEntry
  704.   else
  705.     doSearchFor
  706.   end if
  707.   select text of cd fld "searchFor"
  708. end reopenSearchFiles
  709.  
  710. on setSearchState
  711.   global searchWord, searchByState, searchInState, keyFindings
  712.  
  713.   if searchByState is empty then
  714.     put "Full Text" into searchByState
  715.   end if
  716.   send "zeroSearchBy" to card "Main"
  717.   do "set hilite of btn" && Quote & searchByState & Quote && "to true"
  718.  
  719.   if searchInState is empty then
  720.     put "Whole Catalog" into searchInState
  721.   end if
  722.   do "set the name of cd btn id 15 to" && searchInState
  723.  
  724.   put searchWord into cd fld "searchFor"
  725.   put keyFindings into fld "findings"
  726. end setSearchState
  727.  
  728. on resumeQuickSearch
  729.   global searchWord
  730.  
  731.   setSearchState
  732.   reopenSearchFiles
  733. end resumeQuickSearch
  734.  
  735. on openSearch
  736.   global returnCard
  737.  
  738.   -- user may be in card 2 via "Back" or "Recent"
  739.   put the name of this card into entryCard
  740.  
  741.   hide menubar
  742.   push recent card
  743.   pop card into returnCard  -- for "Return" button
  744.  
  745.   lock screen
  746.   go to card "Main"
  747.   set cursor to busy
  748.   zeroFiles
  749.   resumeQuickSearch
  750.  
  751.   go to entryCard
  752.   set cursor to hand
  753.   unlock screen
  754. end openSearch
  755.  
  756. on emptySearchFields
  757.   go to card 2
  758.   put empty into fld 1
  759.   put empty into fld 2
  760.   put empty into fld 3
  761.   put empty into cd fld 1
  762.   put empty into cd fld 2
  763.  
  764.   go to card 1
  765.   put empty into fld 1
  766.   put empty into cd fld 1
  767. end emptySearchFields
  768.  
  769.  
  770.